home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr26 / netprog.zip / NETPROG.TAR / lib.s5 / nspipe.c < prev    next >
C/C++ Source or Header  |  1989-12-17  |  1KB  |  53 lines

  1. /*
  2.  * Create a named stream pipe.
  3.  */
  4.  
  5. #include    <sys/types.h>
  6. #include    <sys/stat.h>
  7.  
  8. int                    /* return 0 if OK, -1 on error */
  9. ns_pipe(name, fd)
  10. char    *name;        /* user-specified name to assign to the stream pipe */
  11. int    fd[2];        /* two file descriptors returned through here */
  12. {
  13.     int        omask;
  14.     struct stat    statbuff;
  15.  
  16.     /*
  17.      * First create an unnamed stream pipe.
  18.      */
  19.  
  20.     if (s_pipe(fd) < 0)
  21.         return(-1);
  22.  
  23.     /*
  24.      * Now assign the name to one end (the first descriptor, fd[0]).
  25.      * To do this we first find its major/minor device numbers using
  26.      * fstat(2), then use these in a call to mknod(2) to create the
  27.      * filesystem entry.  Beware that mknod(2) is restricted to root
  28.      * (for everything other than FIFOs).
  29.      * Under System VR3.2, the major value for the unnamed stream pipe
  30.      * corresponds to the major for "/dev/spx" and the minor value is
  31.      * whatever the "/dev/spx" clone driver assigned to make the
  32.      * major/minor unique.
  33.      */
  34.  
  35.     if (fstat(fd[0], &statbuff) < 0) {
  36.         close(fd[0]);
  37.         close(fd[1]);
  38.         return(-1);
  39.     }
  40.  
  41.     unlink(name);            /* in case it already exists */
  42.     omask = umask(0);        /* assure mode is 0666 */
  43.     if (mknod(name, S_IFCHR | 0666, statbuff.st_rdev) < 0) {
  44.         close(fd[0]);
  45.         close(fd[1]);
  46.         umask(omask);
  47.         return(-1);
  48.     }
  49.     umask(omask);            /* restore old umask value */
  50.  
  51.     return(0);        /* all OK */
  52. }
  53.